/*最短寻道时间有限算法*/

/*
	SSTF主函数
	参数：
		arr原磁道序列数组，head磁头位置
	算法描述：
		其要求访问的磁道与当前磁头所在的磁道距离最近，
		以使每次的寻道时间最短，
		该算法可以得到比较好的吞吐量，
		但却不能保证平均寻道时间最短。
		其缺点是对用户的服务请求的响应机会不是均等的，
		因而导致响应时间的变化幅度很大。
		在服务请求很多的情况下，
		对内外边缘磁道的请求将会无限期的被延迟，
		有些请求的响应时间将不可预期。
*/

function SSTF(arr, head){
	var arrSrc = arr.slice();//拷贝原数组
	var arrProc = [];//寻道过程
	var arrSeNum = [];//每一次的寻到次数
	var aver = 0;//记录平均值
	var length = arrSrc.length;//记录数组的长度
	var now = head;//记录当前的磁道

	arrSrc.sort(function (m, n) {
		if (m < n) return -1
		else if (m > n) return 1
		else return 0
	});

	if(arrSrc[length-1] <= now){
		//当初始磁道大于最外围磁道的时候
		for(var i=length-1; i>=0; i--){
			arrSeNum.push(Math.abs(now - arrSrc[i]));
			aver += Math.abs(now - arrSrc[i]);
			now = arrSrc[i];
			arrProc.push(now);
		}
	}
	else if(arrSrc[0] >= now){
		//当初始磁道小于最小磁道的时候
		for(var i=0; i<length; i++){
			arrSeNum.push(Math.abs(now - arrSrc[i]));
			aver += Math.abs(now - arrSrc[i]);
			now = arrSrc[i];
			arrProc.push(now);
		}
	}
	else{
		var k=0;//寻找磁头在磁道序列的位置
		while(arrSrc[k] < now){
			k++;
		}
		var left = k-1;
		var right = k;
		while((left >= 0)&&(right < length)){
			if((now - arrSrc[left])>=(arrSrc[right] - now)){
				//磁道往右走
				arrSeNum.push(Math.abs(now - arrSrc[right]));
				aver += Math.abs(now - arrSrc[right]);
				now = arrSrc[right];
				arrProc.push(now);
				right++;
			}
			else{
				//磁道往左走
				arrSeNum.push(Math.abs(now - arrSrc[left]));
				aver += Math.abs(now - arrSrc[left]);
				now = arrSrc[left];
				arrProc.push(now);
				left--;
			}
		}
		while(left>=0){
			arrSeNum.push(Math.abs(now - arrSrc[left]));
			aver += Math.abs(now - arrSrc[left]);
			now = arrSrc[left];
			arrProc.push(now);
			left--;
		}
		while(right<length){
			arrSeNum.push(Math.abs(now - arrSrc[right]));
			aver += Math.abs(now - arrSrc[right]);
			now = arrSrc[right];
			arrProc.push(now);
			right++;
		}
	}
	aver /= length;
	// console.log("arrSeNum=="+aver+"\n"+arrProc+"\n"+arrSeNum);
	
	//最后返回一个，里面包含算法结果的数据结构
	var obj = {
		average : aver,
		arrProc : arrProc,
		arrSeNum : arrSeNum
	}

	return obj;
}